import json

import pandas as pd
import re


def dis(str_):
    str_ = str_.replace('\xa0', '')
    str_ = re.subn('\[\d+\]', '', str_)[0].strip()
    str_ = str_.replace('\n', '').replace("'", "\\'")
    # if "'" in str_:
    #     print(str_)
    return str_


def get_df():
    file_name = 'data/xiaoshuo.json'
    with open(file_name, 'r', encoding='utf-8') as f:
        d = json.load(f)
    data = ([i['name'] for i in d])
    data = [{dis(k): dis(v) for k, v in dict_.items()} for dict_ in data]
    df = pd.DataFrame(data)
    df['name'] = df['中文名']
    df['简称_2'] = df['简称'].apply(lambda x: (re.split('[（、，·]', x.rstrip('）'))) if not pd.isna(x) else [])
    return df


# df.to_csv('a.csv', index=False, encoding='utf-8')

def create_university(df, g):
    for index, row in df.iterrows():
        row = row.dropna()
        d = [f"`{i}`:'{row[i]}'" for i in row.index if i !='简称_2']
        sql = f"CREATE (n:`大学`{{{','.join(d)}}}) return n;"
        print(sql)
        g.run(sql)
        list_ = row['简称_2']
        if '中文名' in row:
            for name in list_:
                sql = f"CREATE (n:`大学简称`{{name:'{name}'}}) return n;"
                print(sql)
                g.run(sql)
                sql = f"match (m:`大学`), (n:`大学简称`) where m.name='{row['中文名']}' and n.name='{name}' create (m)-[:`简称`]->(n)"
                g.run(sql)
                print(sql)

def city_save(g):
    """
    省市关系建立
    """
    file_name = 'data/pc-code.json'
    with open(file_name, 'r', encoding='utf-8') as f:
        d = json.load(f)
    data = [[i['name'], ii['name']] for i in d for ii in i['children']]
    print(data)
    all_node = set(sum(data, []))
    for node in all_node:
        sql = f"create (n:`城市`{{name:'{node}'}})"
        g.run(sql)
    for i, j in data:
        sql = f"match (m), (n) where m.name='{i}' and n.name='{j}' create (m)-[:`包含`]->(n)"
        g.run(sql)


def create_univer_city(g):
    df = pd.read_csv('data/raw_table.csv', encoding='gbk')
    for i in set(df['management'].tolist()):
        sql = f"create (n:`主管单位`{{name:'{i}'}})"
        g.run(sql)
        print(sql)
    for index, row in df.iterrows():
        sql = f"match (m:`大学`) where m.name='{row['name']}' set m.`类型`='{row['class_1']}', m.code={row['code']}"
        g.run(sql)
        print(sql)
        sql = f"match (m), (n) where m.name='{row['name']}' and n.name='{row['city']}' create (m)-[:`位于`]->(n)"
        g.run(sql)
        print(sql)
        sql = f"match (m), (n:`主管单位`) where m.name='{row['name']}' and n.name='{row['city']}' create (m)-[:`主管单位`]->(n)"
        g.run(sql)
        print(sql)


def get_xueke(g):
    dict_ = {
        '北京大学': '哲学、理论经济学、应用经济学、法学、政治学、社会学、马克思主义理论、心理学、中国语言文学、外国语言文学、考古学、中国史、世界史、数学、物理学、化学、地理学、地球物理学、地质学、生物学、生态学、统计学、力学、材料科学与工程、电子科学与技术、控制科学与工程、计算机科学与技术、环境科学与工程、软件工程、基础医学、临床医学、口腔医学、公共卫生与预防医学、药学、护理学、艺术学理论、现代语言学、语言学、机械及航空航天和制造工程、商业与管理、社会政策与管理',
        '中国人民大学': '哲学、理论经济学、应用经济学、法学、政治学、社会学、马克思主义理论、新闻传播学、中国史、统计学、工商管理、农林经济管理、公共管理、图书情报与档案管理',
        '清华大学': '法学、政治学、马克思主义理论、数学、物理学、化学、生物学、力学、机械工程、仪器科学与技术、材料科学与工程、动力工程及工程热物理、电气工程、信息与通信工程、控制科学与工程、计算机科学与技术、建筑学、土木工程、水利工程、化学工程与技术、核科学与技术、环境科学与工程、生物医学工程、城乡规划学、风景园林学、软件工程、管理科学与工程、工商管理、公共管理、设计学、会计与金融、经济学和计量经济学、统计学与运筹学、现代语言学',
        '北京交通大学': '系统科学',
        '北京工业大学': '土木工程（自定）',
        '北京航空航天大学': '力学、仪器科学与技术、材料科学与工程、控制科学与工程、计算机科学与技术、航空宇航科学与技术、软件工程',
        '北京理工大学': '材料科学与工程、控制科学与工程、兵器科学与技术',
        '北京科技大学': '科学技术史、材料科学与工程、冶金工程、矿业工程',
        '北京化工大学': '化学工程与技术（自定）',
        '北京邮电大学': '信息与通信工程、计算机科学与技术',
        '中国农业大学': '生物学、农业工程、食品科学与工程、作物学、农业资源与环境、植物保护、畜牧学、兽医学、草学',
        '北京林业大学': '风景园林学、林学',
        '北京协和医学院': '生物学、生物医学工程、临床医学、药学',
        '北京中医药大学': '中医学、中西医结合、中药学',
        '北京师范大学': '教育学、心理学、中国语言文学、中国史、数学、地理学、系统科学、生态学、环境科学与工程、戏剧与影视学、语言学',
        '首都师范大学': '数学',
        '北京外国语大学': '外国语言文学',
        '中国传媒大学': '新闻传播学、戏剧与影视学',
        '中央财经大学': '应用经济学',
        '对外经济贸易大学': '应用经济学（自定）',
        '外交学院': '政治学（自定）',
        '中国人民公安大学': '公安学（自定）',
        '北京体育大学': '体育学',
        '中央音乐学院': '音乐与舞蹈学',
        '中国音乐学院': '音乐与舞蹈学（自定）',
        '中央美术学院': '美术学、设计学',
        '中央戏剧学院': '戏剧与影视学',
        '中央民族大学': '民族学',
        '中国政法大学': '法学',
        '南开大学': '世界史、数学、化学、统计学、材料科学与工程',
        '天津大学': '化学、材料科学与工程、化学工程与技术、管理科学与工程',
        '天津工业大学': '纺织科学与工程',
        '天津医科大学': '临床医学（自定）',
        '天津中医药大学': '中药学',
        '华北电力大学': '电气工程（自定）',
        '河北工业大学': '电气工程（自定）',
        '太原理工大学': '化学工程与技术（自定）',
        '内蒙古大学': '生物学（自定）',
        '辽宁大学': '应用经济学（自定）',
        '大连理工大学': '化学、工程',
        '东北大学': '控制科学与工程',
        '大连海事大学': '交通运输工程（自定）',
        '吉林大学': '考古学、数学、物理学、化学、材料科学与工程',
        '延边大学': '外国语言文学（自定）',
        '东北师范大学': '马克思主义理论、世界史、数学、化学、统计学、材料科学与工程',
        '哈尔滨工业大学': '力学、机械工程、材料科学与工程、控制科学与工程、计算机科学与技术、土木工程、环境科学与工程',
        '哈尔滨工程大学': '船舶与海洋工程',
        '东北农业大学': '畜牧学（自定）',
        '东北林业大学': '林业工程、林学',
        '复旦大学': '哲学、政治学、中国语言文学、中国史、数学、物理学、化学、生物学、生态学、材料科学与工程、环境科学与工程、基础医学、临床医学、中西医结合、药学、机械及航空航天和制造工程、现代语言学',
        '同济大学': '建筑学、土木工程、测绘科学与技术、环境科学与工程、城乡规划学、风景园林学、艺术与设计',
        '上海交通大学': '数学、化学、生物学、机械工程、材料科学与工程、信息与通信工程、控制科学与工程、计算机科学与技术、土木工程、化学工程与技术、船舶与海洋工程、基础医学、临床医学、口腔医学、药学、电子电气工程、商业与管理',
        '华东理工大学': '化学、材料科学与工程、化学工程与技术',
        '东华大学': '纺织科学与工程',
        '上海海洋大学': '水产',
        '上海中医药大学': '中医学、中药学',
        '华东师范大学': '教育学、生态学、统计学',
        '上海外国语大学': '外国语言文学',
        '上海财经大学': '统计学',
        '上海体育学院': '体育学',
        '上海音乐学院': '音乐与舞蹈学',
        '上海大学': '机械工程（自定）',
        '南京大学': '哲学、中国语言文学、外国语言文学、物理学、化学、天文学、大气科学、地质学、生物学、材料科学与工程、计算机科学与技术、化学工程与技术、矿业工程、环境科学与工程、图书情报与档案管理',
        '苏州大学': '材料科学与工程（自定）',
        '东南大学': '材料科学与工程、电子科学与技术、信息与通信工程、控制科学与工程、计算机科学与技术、建筑学、土木工程、交通运输工程、生物医学工程、风景园林学、艺术学理论',
        '南京航空航天大学': '力学',
        '南京理工大学': '兵器科学与技术',
        '中国矿业大学': '安全科学与工程、矿业工程',
        '南京邮电大学': '电子科学与技术',
        '河海大学': '水利工程、环境科学与工程',
        '江南大学': '轻工技术与工程、食品科学与工程',
        '南京林业大学': '林业工程',
        '南京信息工程大学': '大气科学',
        '南京农业大学': '作物学、农业资源与环境',
        '南京中医药大学': '中药学',
        '中国药科大学': '中药学',
        '南京师范大学': '地理学',
        '浙江大学': '化学、生物学、生态学、机械工程、光学工程、材料科学与工程、电气工程、控制科学与工程、计算机科学与技术、农业工程、环境科学与工程、软件工程、园艺学、植物保护、基础医学、药学、管理科学与工程、农林经济管理',
        '中国美术学院': '美术学',
        '安徽大学': '材料科学与工程（自定）',
        '中国科学技术大学': '数学、物理学、化学、天文学、地球物理学、生物学、科学技术史、材料科学与工程、计算机科学与技术、核科学与技术、安全科学与工程',
        '合肥工业大学': '管理科学与工程（自定）',
        '厦门大学': '化学、海洋科学、生物学、生态学、统计学',
        '福州大学': '化学（自定）',
        '南昌大学': '材料科学与工程',
        '山东大学': '数学、化学',
        '中国海洋大学': '海洋科学、水产',
        '中国石油大学（华东）': '石油与天然气工程、地质资源与地质工程',
        '郑州大学': '临床医学（自定）、材料科学与工程（自定）、化学（自定）',
        '河南大学': '生物学',
        '武汉大学': '理论经济学、法学、马克思主义理论、化学、地球物理学、生物学、测绘科学与技术、矿业工程、口腔医学、图书情报与档案管理',
        '华中科技大学': '机械工程、光学工程、材料科学与工程、动力工程及工程热物理、电气工程、计算机科学与技术、基础医学、公共卫生与预防医学',
        '中国地质大学（武汉）': '地质学、地质资源与地质工程',
        '武汉理工大学': '材料科学与工程',
        '华中农业大学': '生物学、园艺学、畜牧学、兽医学、农林经济管理',
        '华中师范大学': '政治学、中国语言文学',
        '中南财经政法大学': '法学（自定）',
        '湖南大学': '化学、机械工程',
        '中南大学': '数学、材料科学与工程、冶金工程、矿业工程',
        '湖南师范大学': '外国语言文学（自定）',
        '中山大学': '哲学、数学、化学、生物学、生态学、材料科学与工程、电子科学与技术、基础医学、临床医学、药学、工商管理',
        '暨南大学': '药学（自定）',
        '华南理工大学': '化学、材料科学与工程、轻工技术与工程、农学',
        '广州中医药大学': '中医学',
        '华南师范大学': '物理学',
        '海南大学': '作物学（自定）',
        '广西大学': '土木工程（自定）',
        '四川大学': '数学、化学、材料科学与工程、基础医学、口腔医学、护理学',
        '重庆大学': '机械工程（自定）、电气工程（自定）、土木工程（自定）',
        '西南交通大学': '交通运输工程',
        '电子科技大学': '电子科学与技术、信息与通信工程',
        '西南石油大学': '石油与天然气工程',
        '成都理工大学': '地质学',
        '四川农业大学': '作物学（自定）',
        '成都中医药大学': '中药学',
        '西南大学': '生物学',
        '西南财经大学': '应用经济学（自定）',
        '贵州大学': '植物保护（自定）',
        '云南大学': '民族学、生态学',
        '西藏大学': '生态学（自定）',
        '西北大学': '地质学',
        '西安交通大学': '力学、机械工程、材料科学与工程、动力工程及工程热物理、电气工程、信息与通信工程、管理科学与工程、工商管理',
        '西北工业大学': '机械工程、材料科学与工程',
        '西安电子科技大学': '信息与通信工程、计算机科学与技术',
        '长安大学': '交通运输工程（自定）',
        '西北农林科技大学': '农学',
        '陕西师范大学': '中国语言文学（自定）',
        '兰州大学': '化学、大气科学、生态学、草学',
        '青海大学': '生态学（自定）',
        '宁夏大学': '化学工程与技术（自定）',
        '新疆大学': '马克思主义理论（自定）、化学（自定）、计算机科学与技术（自定）',
        '石河子大学': '化学工程与技术（自定）',
        '中国矿业大学（北京）': '安全科学与工程、矿业工程',
        '中国石油大学（北京）': '石油与天然气工程、地质资源与地质工程',
        '中国地质大学（北京）': '地质学、地质资源与地质工程',
        '宁波大学': '力学',
        '中国科学院大学': '化学、材料科学与工程',
        '国防科技大学': '信息与通信工程、计算机科学与技术、航空宇航科学与技术、软件工程、管理科学与工程',
        '第二军医大学': '基础医学',
        '第四军医大学': '临床医学（自定）',
    }

    for university_name, subject in dict_.items():
        subject_list = [i.replace("（自定）", '') for i in subject.split('、')]
        sql = f"match (n) where n.name='{university_name}' return n.name"
        if not g.run(sql).data():
            sql = f"create (n:`大学`{{name:'{university_name}'}})"
            g.run(sql)
            print(sql)
        for subject_one in subject_list:
            sql = f"match (n) where n.name='{subject_one}' return n.name"
            if not g.run(sql).data():
                sql = f"create (n:`学科`{{name:'{subject_one}'}})"
                g.run(sql)
                print(sql)
            sql = f"match (m:`大学`), (n:`学科`) where m.name='{university_name}' and n.name='{subject_one}' create (m)-[:`包含`]->(n)"
            g.run(sql)
            print(sql)


def get_detail(df):
    university_985 = ['清华大学', '北京大学', '厦门大学', '南京大学', '复旦大学', '天津大学',
                      '浙江大学', '南开大学', '西安交通大学', '东南大学', '武汉大学', '上海交通大学', '山东大学', '湖南大学',
                      '中国人民大学', '吉林大学', '重庆大学', '电子科技大学', '四川大学', '中山大学', '华南理工大学', '兰州大学',
                      '东北大学', '西北工业大学', '哈尔滨工业大学', '华中科技大学', '中国海洋大学', '北京理工大学', '大连理工大学',
                      '北京航空航天大学', '北京师范大学', '同济大学', '中南大学', '中国科学技术大学', '中国农业大学', '国防科学技术大学', '中央民族大学',
                      '华东师范大学', '西北农林科技大学', ]
    university_211 = ['清华大学', '北京大学', '中国人民大学', '北京工业大学', '北京理工大学', '北京航空航天大学', '北京化工大学', '北京邮电大学', '对外经济贸易大学',
                      '中国传媒大学', '中央民族大学', '中国矿业大学（北京）', '中央财经大学', '中国政法大学', '中国石油大学（北京）', '中央音乐学院', '北京体育大学', '北京外国语大学',
                      '北京交通大学', '北京科技大学', '北京林业大学', '中国农业大学', '北京中医药大学', '华北电力大学（北京）', '北京师范大学', '中国地质大学（北京）', '复旦大学',
                      '华东师范大学', '上海外国语大学', '上海大学', '同济大学', '华东理工大学', '东华大学', '上海财经大学', '上海交通大学', '南开大学', '天津大学',
                      '天津医科大学', '重庆大学', '西南大学', '华北电力大学（保定）', '河北工业大学', '太原理工大学', '内蒙古大学', '大连理工大学', '东北大学', '辽宁大学',
                      '大连海事大学', '吉林大学', '东北师范大学', '延边大学', '东北农业大学', '东北林业大学', '哈尔滨工业大学', '哈尔滨工程大学', '南京大学', '东南大学',
                      '苏州大学', '河海大学', '中国药科大学', '中国矿业大学（徐州）', '南京师范大学', '南京理工大学', '南京航空航天大学', '江南大学', '南京农业大学', '浙江大学',
                      '安徽大学', '合肥工业大学', '中国科学技术大学', '厦门大学', '福州大学', '南昌大学', '山东大学', '中国海洋大学', '中国石油大学（华东）', '郑州大学',
                      '武汉大学', '华中科技大学', '中国地质大学（武汉）', '华中师范大学', '华中农业大学', '中南财经政法大学', '武汉理工大学', '湖南大学', '中南大学',
                      '湖南师范大学', '中山大学', '暨南大学', '华南理工大学', '华南师范大学', '广西大学', '四川大学', '西南交通大学', '电子科技大学', '西南财经大学',
                      '四川农业大学', '云南大学', '贵州大学', '西北大学', '西安交通大学', '西北工业大学', '陕西师范大学', '西北农林科大', '西安电子科技大学', '长安大学',
                      '兰州大学', '新疆大学', '石河子大学', '海南大学', '宁夏大学', '青海大学', '西藏大学', '第二军医大学', '第四军医大学', '国防科学技术大学']
    university_yiliu = [
        "北京大学", "中国人民大学", "清华大学", "北京航空航天大学", "北京理工大学",
        "中国农业大学", "北京师范大学", "中央民族大学", "南开大学", "天津大学",
        "大连理工大学", "吉林大学", "哈尔滨工业大学", "复旦大学", "同济大学",
        "上海交通大学", "华东师范大学", "南京大学", "东南大学", "浙江大学",
        "中国科学技术大学", "厦门大学", "山东大学", "中国海洋大学", "武汉大学",
        "华中科技大学", "中南大学", "中山大学", "华南理工大学", "四川大学",
        "重庆大学", "电子科技大学", "西安交通大学", "西北工业大学", "兰州大学",
        "国防科技大学",
        "东北大学", "郑州大学", "湖南大学", "云南大学", "西北农林科技大学",
        "新疆大学",
        "北京交通大学", "北京工业大学", "北京科技大学", "北京化工大学", "北京邮电大学",
        "北京林业大学", "北京协和医学院", "北京中医药大学", "首都师范大学", "北京外国语大学",
        "中国传媒大学", "中央财经大学", "对外经济贸易大学", "外交学院", "中国人民公安大学",
        "北京体育大学", "中央音乐学院", "中国音乐学院", "中央美术学院", "中央戏剧学院",
        "中国政法大学", "天津工业大学", "天津医科大学", "天津中医药大学", "华北电力大学",
        "河北工业大学", "太原理工大学", "内蒙古大学", "辽宁大学", "大连海事大学",
        "延边大学", "东北师范大学", "哈尔滨工程大学", "东北农业大学", "东北林业大学",
        "华东理工大学", "东华大学", "上海海洋大学", "上海中医药大学", "上海外国语大学",
        "上海财经大学", "上海体育学院", "上海音乐学院", "上海大学", "苏州大学",
        "南京航空航天大学", "南京理工大学", "中国矿业大学", "南京邮电大学", "河海大学",
        "江南大学", "南京林业大学", "南京信息工程大学", "南京农业大学", "南京中医药大学",
        "中国药科大学", "南京师范大学", "中国美术学院", "安徽大学", "合肥工业大学",
        "福州大学", "南昌大学", "河南大学", "中国地质大学", "武汉理工大学",
        "华中农业大学", "华中师范大学", "中南财经政法大学", "湖南师范大学", "暨南大学",
        "广州中医药大学", "华南师范大学", "海南大学", "广西大学", "西南交通大学",
        "西南石油大学", "成都理工大学", "四川农业大学", "成都中医药大学", "西南大学",
        "西南财经大学", "贵州大学", "西藏大学", "西北大学", "西安电子科技大学",
        "长安大学", "陕西师范大学", "青海大学", "宁夏大学", "石河子大学",
        "中国石油大学", "宁波大学", "中国科学院大学", "第二军医大学", "第四军医大学",
    ]

    df['双一流'] = df['中文名'].apply(lambda x: x in university_yiliu)
    df['211'] = df['中文名'].apply(lambda x: x in university_211)
    df['985'] = df['中文名'].apply(lambda x: x in university_985)
    print(df['双一流'].value_counts())
    print(df['211'].value_counts())
    print(df['985'].value_counts())

    for name in ['双一流', '211', '985']:
        sql = f"create (n:`学校层次`{{name:'{name}'}})"
        print(sql)
        g.run(sql)
    for index, row in df.iterrows():
        for name in ['双一流', '211', '985']:
            if row[name]:
                sql = f"match (m), (n) where m.name='{row['中文名']}' and n.name='{name}' create (m)-[:`属于`]->(n)"
                print(sql)
                g.run(sql)


if __name__ == '__main__':
    from py2neo import Graph

    neo4j_support_url = {
        # 'host': 'xx.xx.xx.xx',
        'port': 7687,
        'user': 'neo4j',
        'password': 'password',
    }

    g = Graph(
        host=neo4j_support_url['host'],
        port=neo4j_support_url['port'],
        user=neo4j_support_url['user'],
        password=neo4j_support_url['password']
    )

    df = get_df()
    create_university(df, g)  # 创建大学实体
    city_save(g)  # 城市
    create_univer_city(g)  # 大学和城市建立关系
    get_detail(df)  # 211 985加入
    get_xueke(g)  # 双一流学科

